#include <iostream>

using namespace std;

// 默认容量为 10
#define DEFAULT_CAPACITY 10
/*
将数组操作相关数据封装到一个结构体中
    包括数组本身 array_data
    数组对应容量 capacity
    数组存储的有效元素个数 size
*/
struct My_Array
{
    /**
     * array_data 直接当做 int 类型数组使用。
     */
    int *array_data;
    /**
     * 当前 array_data 数组的容量
     */
    int capacity;
    /**
     * 当前 array_data 数组的有效元素个数
     */
    int size;

    /*
    需要在 My_Array 结构体中，实现【增删改查】内容。将之前讲解的
    数组相关算法移植到结构体中，利用结构体成员变量的数据多元性，
    更好完成相关代码实现。
    */
    /**
     * 利用函数对当前结构体中的成员变量进行必要的初始化操作
     * 【核心内容】
     *       1. 数组相关内存空间申请，临时利用 new 关键字
     *       2. 数组容量初始化操作
     *       3. 数组有效元素初始化操作
     */
    void init_my_array();

    /**
     * 添加元素到 My_Array 底层 array_data 数组中，采用的添加
     * 方式为尾插法。
     *
     * @param ele 用户提供的 int 类型元素
     */
    void add_element(int ele);

    /**
     * 展示底层数组的数据相关内容
     */
    void show();
};

int main(int argc, char const *argv[])
{
    My_Array my_array;

    // my_array 调用初始化操作
    my_array.init_my_array();

    my_array.add_element(1);
    my_array.add_element(2);
    my_array.add_element(3);

    my_array.show();

    return 0;
}

/*
My_Array::init_my_array
    My_Array:: 作用域运算符, 俗称 四饼
    明确告知编译器，当前实现的函数是 My_Array 结构体中的
    成员函数。
*/
void My_Array::init_my_array()
{
    /*
    申请存储 int 类型数据的数组空间
    */
    array_data = new int[DEFAULT_CAPACITY];
    /*
    capacity 对应底层数组的容量，赋值为默认容量 DEFAULT_CAPACITY
    */
    capacity = DEFAULT_CAPACITY;
    /*
    当前 size 有效元素个数为 0
    */
    size = 0;
}

void My_Array::add_element(int ele)
{
    array_data[size++] = ele;
}


void My_Array::show()
{
    // 当前数组有效元素为 0 ，没有元素
    if (0 == size)
    {
        cout << "[]" << endl;
    }

    cout << '[';
    
    for (int i = 0; i < size - 1; i++)
    {
        cout << array_data[i] << ", ";
    }

    cout << array_data[size - 1] << ']' << endl;
}